﻿// -------------------------------------------------------------------------
//    @FileName         :    NFBagPageInterfaceBase.cpp
//    @Author           :    gaoyi
//    @Date             :    2024/12/24
//    @Email            :    445267987@qq.com
//    @Module           :    NFBagPageInterfaceBase
//    @Desc             :    基于 NFBagPage 的通用页签接口实现：转发读写、提交前后统计。
// -------------------------------------------------------------------------

#include "NFBagPageInterfaceBase.h"

#include <NFBagPage.h>
#include <NFComm/NFPluginModule/NFCheck.h>

/**
 * @brief 构造函数
 * @param pBagPage 背包页签对象指针
 */
NFBagPageInterfaceBase::NFBagPageInterfaceBase(NFBagPage* pBagPage):m_pBagPage(pBagPage)
{
    m_iCommitBeforeGridNum = -1;
    m_bIsSetWare = false;
}

/**
 * @brief 析构函数
 */
NFBagPageInterfaceBase::~NFBagPageInterfaceBase()
{
}

/**
 * @brief 获取页签容量
 * @param iCapacity 输出容量
 * @return 0成功，非0失败
 */
int NFBagPageInterfaceBase::GetCapacity(int& iCapacity) const
{
    CHECK_NULL(0, m_pBagPage);
    iCapacity = m_pBagPage->GetCapacity();
    return 0;
}

/**
 * @brief 获取空格子数量
 * @param iEmptyGridNum 输出空格子数量
 * @return 0成功，非0失败
 */
int NFBagPageInterfaceBase::GetEmptyGridNum(int& iEmptyGridNum) const
{
    CHECK_NULL(0, m_pBagPage);
    iEmptyGridNum = m_pBagPage->GetEmptyGridNum();
    return 0;
}

/**
 * @brief 获取页签类型
 * @param iPageType 输出页签类型
 * @return 0成功，非0失败
 */
int NFBagPageInterfaceBase::GetBagType(int& iPageType) const
{
    CHECK_NULL(0, m_pBagPage);
    iPageType = m_pBagPage->GetPageType();
    return 0;
}

/**
 * @brief 检查格子是否为空
 * @param iGridIndex 格子索引
 * @param bIsEmpty 输出是否为空
 * @return 0成功，非0失败
 */
int NFBagPageInterfaceBase::GetIsEmpty(int iGridIndex, bool& bIsEmpty) const
{
    CHECK_NULL(0, m_pBagPage);
    return m_pBagPage->CheckIsGridEmpty(iGridIndex, &bIsEmpty);
}

/**
 * @brief 获取格子物品
 * @param iGridIndex 格子索引
 * @param pItem 输出物品指针
 * @return 0成功，非0失败
 */
int NFBagPageInterfaceBase::GetItem(int iGridIndex, NFGridItem*& pItem) const
{
    CHECK_NULL(0, m_pBagPage);
    pItem = m_pBagPage->GetItemByIndex(iGridIndex);
    CHECK_NULL(0, pItem);
    return 0;
}

/**
 * @brief 设置格子物品
 * @param pBagPageOp 页签操作器
 * @param iGridIndex 格子索引
 * @param pItem 物品指针
 * @param bPreCheckFlag 是否为预检查模式
 * @return 0成功，非0失败
 */
int NFBagPageInterfaceBase::SetItem(const NFBagPageOp* pBagPageOp, int iGridIndex, const NFGridItem* pItem, bool bPreCheckFlag)
{
    CHECK_NULL(0, m_pBagPage);
    int iRetCode = m_pBagPage->SetItem(iGridIndex, pItem, bPreCheckFlag);
    CHECK_ERR(0, iRetCode, "SetItem Failed, iGridIndex:{}", iGridIndex);

    if (bPreCheckFlag)
    {
        return 0;
    }

    m_bIsSetWare = true;

    return 0;
}

/**
 * @brief 检查本次是否设置过物品
 * @return true已设置，false未设置
 */
bool NFBagPageInterfaceBase::IsSetWare() const
{
    return m_bIsSetWare;
}

/**
 * @brief 比较两个页签接口是否相等
 * @param pOther 另一个页签接口
 * @return true相等，false不相等
 */
bool NFBagPageInterfaceBase::Equal(const NFBagPageInterface* pOther) const
{
    if (this == pOther)
    {
        return true;
    }

    const NFBagPageInterfaceBase* pOtherBase = dynamic_cast<const NFBagPageInterfaceBase*>(pOther);
    if (pOther == NULL)
    {
        return false;
    }

    return m_pBagPage == pOtherBase->m_pBagPage;
}

/**
 * @brief 提交前回调
 * @param bPreCheckFlag 是否为预检查模式
 * @return 0成功，非0失败
 */
int NFBagPageInterfaceBase::OnCommitBefore(bool bPreCheckFlag)
{
    CHECK_NULL(0, m_pBagPage);
    if (bPreCheckFlag)
    {
        return 0;
    }

    m_iCommitBeforeGridNum = m_pBagPage->GetUsedGridNum();
    LOG_TRACE(0, "m_iCommitBeforeGridNum:{}", m_iCommitBeforeGridNum);

    return 0;
}

/**
 * @brief 提交后回调
 * @param pBagPageOp 页签操作器
 * @return 0成功，非0失败
 */
int NFBagPageInterfaceBase::OnCommitAfter(const NFBagPageOp* pBagPageOp)
{
    CHECK_NULL(0, m_pBagPage);
    int iRetCode = 0;

    int iBagType = 0;
    iRetCode = GetBagType(iBagType);
    CHECK_ERR(0, iRetCode, "GetIndex Failed");

    int iCommitAfterGridNum = m_pBagPage->GetUsedGridNum();
    LOG_TRACE(0, "iBagType:{} m_iCommitBeforeGridNum:{} iCommitAfterGridNum:{}", iBagType, m_iCommitBeforeGridNum, iCommitAfterGridNum);

    return 0;
}

/**
 * @brief 排序页签物品
 * @return 0成功，非0失败
 */
int NFBagPageInterfaceBase::Sort()
{
    CHECK_NULL(0, m_pBagPage);
    m_pBagPage->Sort();
    return 0;
}
